// 导入了 `globals`全局变量的库模块，该模块提供了一组预定义的全局变量（如 window、document 等）
// 这些变量通常在不同的环境（如浏览器、Node.js）中可用。在 ESLint 配置中，你可以使用这个模块来指定代码所运行的环境，从而定义全局变量。
import globals from "globals";
//针对 JavaScript 的 ESLint 配置和规则。保持 JavaScript 代码的一致性和质量
import pluginJs from "@eslint/js";

// 导入 `typescript-eslint` 插件（ `typescript-eslint/parser` 和 `typescript-eslint/eslint-plugin`）。
// 提供了对 TypeScript 的支持，包括 TS 的解析器和推荐的规则集，用于在 TypeScript 文件中进行 lint 检查。
import tseslint from 'typescript-eslint';

// ESLint 核心插件 导入 `eslint-plugin-vue` 插件，提供了 Vue.js 特有 ESLint 规则
import pluginVue from "eslint-plugin-vue";

// Prettier 插件及配置
import pluginPrettier from "eslint-plugin-prettier";


// 解析器
import parserVue from 'vue-eslint-parser';

/** @type {import('eslint').Linter.Config[]} */
export default [
  // 通用配置
  // ...pluginVue.configs["flat/essential"],
  {
    ...pluginJs.configs.recommended,
    languageOptions: {
      globals: {
        ...globals.browser, // 浏览器变量 (window, document 等)
        ...globals.node // Node.js 变量 (process, require 等)
      }
    },
    plugins: {
      prettier: pluginPrettier
    },
    ignores: [
      '/dist',
      '/public',
      '/node_modules',
      '**/*.config.mjs',
      '**/*.tsbuildinfo',
      '/src/manifest.json',
      '**/pnpm-lock.yaml',
      '**/CHANGELOG*.md',
      '**/*.min.*',
      '**/LICENSE*',
      '**/auto-import?(s).d.ts',
      '**/components.d.ts'
    ],
    rules: {
      ...pluginPrettier.configs.recommended.rules,
      'no-debug': 'off', // 允许使用 debugger
      'prettier/prettier': [
        'error',
        {
          endOfLine: 'auto' // 解决换行符冲突
        }
      ],
      'no-duplicate-imports': 'error'
    }
  },


  // TypeScript 配置
  {
    files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
    languageOptions: {
      parser: tseslint.parser,
      parserOptions: {
        sourceType: 'module'
      }
    },
    plugins: {
      '@typescript-eslint': tseslint.plugin
    },
    rules: {
      ...tseslint.configs.recommended.rules,
      "@typescript-eslint/ban-types": "off", //关闭对特定类型定义的检查，允许使用一些不推荐的类型
      "@typescript-eslint/no-redeclare": "error", // 禁止变量或函数的重复声明
      "@typescript-eslint/ban-ts-comment": "off", // 关闭对 TypeScript 注释的限制，允许使用 '// @ts-ignore' 等注释
      "@typescript-eslint/no-explicit-any": "off", // 关闭对使用 'any' 类型的限制，但在实践中应尽量避免使用 'any'
      "@typescript-eslint/prefer-as-const": "warn", // 建议在可能的情况下使用 'as const' 语法来优化类型推断
      "@typescript-eslint/no-empty-function": "off", // 关闭对空函数体的检查，允许存在没有操作的函数
      "@typescript-eslint/no-non-null-assertion": "off", // 关闭对非空断言的限制，但在使用时需确保安全性
      "@typescript-eslint/no-unused-expressions": "off", // 关闭对未使用的表达式的检查，允许存在未使用的赋值等操作
      "@typescript-eslint/no-unsafe-function-type": "off", // 关闭对潜在不安全函数类型的检查，允许使用函数类型
      "@typescript-eslint/no-import-type-side-effects": "error", // 禁止导入类型时产生副作用
      '@typescript-eslint/no-empty-object-type': 'off', // 允许空对象类型
      "@typescript-eslint/explicit-module-boundary-types": "off", // 关闭对模块边界的显式类型定义要求
      "@typescript-eslint/consistent-type-imports": [
        // 要求在导入类型时保持一致性，禁止某些不一致的导入方式
        "error",
        { disallowTypeAnnotations: false, fixStyle: "inline-type-imports" }
      ],
      "@typescript-eslint/prefer-literal-enum-member": [
        // 要求枚举成员尽量使用字面量类型，允许位运算表达式
        "error",
        { allowBitwiseExpressions: true }
      ],
      "@typescript-eslint/no-unused-vars": [
        // 检查未使用的变量，但忽略以下划线开头的参数或变量
        "error",
        {
          argsIgnorePattern: "^_",
          varsIgnorePattern: "^_"
        }
      ],
    }
  },

  {
    // 针对声明文件的配置
    files: ["**/*.d.ts"],
    rules: {
      "eslint-comments/no-unlimited-disable": "off",
      "import/no-duplicates": "off",
      "unused-imports/no-unused-vars": "off"
    }
  },
  // JavaScript (commonjs) 配置
  {
    files: ["**/*.?([cm])js"],
    rules: {
      "@typescript-eslint/no-require-imports": "off",
      "@typescript-eslint/no-var-requires": "off"
    }
  },
  // Vue 文件配置
  {
    files: ['**/*.vue'],
    languageOptions: {
      parser: parserVue,
      parserOptions: {
        parser: tseslint.parser,
        sourceType: 'module'
      }
    },
    plugins: {
      vue: pluginVue
    },
    processor: pluginVue.processors['.vue'],
    rules: {
      ...pluginVue.configs['vue3-recommended'].rules,
      'vue/no-v-html': 'off', // 允许 v-html
      'vue/require-default-prop': 'off', // 允许没有默认值的 prop
      'vue/multi-word-component-names': 'off', // 关闭组件名称多词要求
      "no-undef": "off",
      "vue/require-explicit-emits": "off",
      "vue/no-setup-props-reactivity-loss": "off",
      // 配置 HTML 自闭合标签的规则
      "vue/html-self-closing": [
        "error",
        {
          html: {
            void: "always",
            normal: "always",
            component: "always"
          },
          svg: "always",
          math: "always"
        }
      ],
      'no-unused-vars': [
        'error',
        {
          varsIgnorePattern: '^_',
          argsIgnorePattern: '^_'
        }
      ],

    }
  }
];
